﻿
#include "zyLmageList.h"


BlackMoonUI::zyLmageList::zyLmageList()
{
	m_obj->setDestroy(zyLmageList_Destroy);
}
BlackMoonUI::zyLmageList::~zyLmageList()
{

}
void WINAPI BlackMoonUI::zyLmageList::zyLmageList_Destroy(resObject* obj)
{
	HIMAGELIST hImageList = (HIMAGELIST)obj->getDataValue();
	if (hImageList != NULL) {
		ImageList_Destroy(hImageList);
	}
	zyRes::zyRes_Destroy(obj);
}
HIMAGELIST BlackMoonUI::zyLmageList::取句柄() {
	return (HIMAGELIST)GetMember();
}
void BlackMoonUI::zyLmageList::置句柄(HIMAGELIST him)
{
	销毁();
	SetMember((LONG_PTR)him);
}
void BlackMoonUI::zyLmageList::销毁() {//Destroy
	HIMAGELIST hImageList = (HIMAGELIST)GetMember();
	if (hImageList != 0) {
		ImageList_Destroy(hImageList);
		SetMember(0);
	}
}
bool BlackMoonUI::zyLmageList::创建自位图文件(const std::wstring& 参数_文件名, int 参数_宽度, int 参数_图标数, int 参数_掩码色) {
	HIMAGELIST hImageList = ImageList_LoadImage(0, 参数_文件名.c_str(), 参数_宽度, 参数_图标数, 参数_掩码色, IMAGE_BITMAP, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
	SetMember((LONG_PTR)hImageList);
	return hImageList != 0;
}
int BlackMoonUI::zyLmageList::添加图标(zyIcon& 参数_图标) {
	return ImageList_AddIcon((HIMAGELIST)GetMember(), (HICON)参数_图标.getIcon());
}
int BlackMoonUI::zyLmageList::添加图标句柄(HICON 参数_图标句柄) {
	return ImageList_AddIcon((HIMAGELIST)GetMember(), 参数_图标句柄);
}
bool BlackMoonUI::zyLmageList::Create(int cx, int cy, UINT flags, int initial)
{
	销毁();
	if (flags == 0)
		flags = 图片组创建_32色 | 图片组创建_掩码;
	HIMAGELIST hImageList = ImageList_Create(cx, cy, flags, initial, initial);
	SetMember((LONG_PTR)hImageList);
	return hImageList != NULL;
}
bool BlackMoonUI::zyLmageList::创建自字节集(byte* 参数_图片组字节集, int 参数_图片组字节集大小, bool 参数_是否易语言格式) {
	// 成功返回真，失败返回假。
	byte* bin = 参数_图片组字节集;
	int bin_size = 参数_图片组字节集大小;
	if (参数_是否易语言格式) {
		// 跳过前8个字节
		bin = 参数_图片组字节集 + 8;
		bin_size = 参数_图片组字节集大小 - 8;
	}
	// 创建基于内存的 IStream
	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, bin_size);
	if (!hGlobal) {
		return false;
	}
	void* pBuffer = GlobalLock(hGlobal);
	if (!pBuffer) {
		GlobalFree(hGlobal);
		return false;
	}
	// 将字节数据复制到全局内存中
	memcpy(pBuffer, bin, bin_size);
	GlobalUnlock(hGlobal);

	IStream* 局部_lStream = nullptr;
	if (CreateStreamOnHGlobal(hGlobal, TRUE, &局部_lStream) != S_OK) {
		GlobalFree(hGlobal);
		return false;
	}
	// 使用 IStream 读取图像列表
	HIMAGELIST hImageList = ImageList_Read(局部_lStream);
	if (hImageList == nullptr) {
		局部_lStream->Release();
		return false;
	}
	SetMember((LONG_PTR)hImageList);
	局部_lStream->Release();
	return hImageList != 0;
}
int BlackMoonUI::zyLmageList::添加文件W(byte* 参数_文件名, int 参数_文件名长度, int 参数_文件格式, bool 参数_自动分割) {
	// 从图像文件里添加图像，成功返回该图片在图片组中的索引，失败返回-1
	HANDLE 局部_句柄 = 0;
	int 局部_宽度 = 0;
	int 局部_高度 = 0;
	int 局部_返回值 = 0;
	HIMAGELIST hImageList = (HIMAGELIST)GetMember();
	// 如果文件格式为0且不自动分割，获取图像列表的图标大小
	if (参数_文件格式 == 0 && 参数_自动分割 == false) {
		ImageList_GetIconSize(hImageList, &局部_宽度, &局部_高度);
	}

	// 将 byte* 转换为宽字符串（UTF-16）
	std::wstring 文件名;
	文件名.resize(参数_文件名长度 / 2); // 每个宽字符占2个字节
	memcpy(&文件名[0], 参数_文件名, 参数_文件名长度);

	// 加载图像
	局部_句柄 = LoadImage(0, 文件名.c_str(), 参数_文件格式, 局部_宽度, 局部_高度, LR_LOADFROMFILE);
	if (局部_句柄 == nullptr) {
		return -1; // 加载失败
	}

	// 根据文件格式添加图像到图像列表
	if (参数_文件格式 == 图片组文件_位图) {
		局部_返回值 = ImageList_Add(hImageList, (HBITMAP)局部_句柄, 0);
		DeleteObject(局部_句柄); // 释放位图资源
		return 局部_返回值;
	}
	else if (参数_文件格式 == 图片组文件_图标) {
		局部_返回值 = ImageList_AddIcon(hImageList, (HICON)局部_句柄);
		DestroyIcon((HICON)局部_句柄); // 释放图标资源
		return 局部_返回值;
	}

	return -1; // 不支持的文件格式
}
int BlackMoonUI::zyLmageList::添加文件(const std::wstring& 参数_文件名, int 参数_文件格式, bool 参数_自动分割) {//从图象文件里添加图象，成功返回该图片在图片组中的索引，失败返回-1
	int 局部_宽度 = 0;
	int 局部_高度 = 0;
	int 局部_返回值 = 0;
	HIMAGELIST hImageList = (HIMAGELIST)GetMember();
	if (参数_文件格式 == 0 && 参数_自动分割 == false)
		ImageList_GetIconSize(hImageList, &局部_宽度, &局部_高度);
	HANDLE 局部_句柄 = LoadImage(0, 参数_文件名.c_str(), 参数_文件格式, 局部_宽度, 局部_高度, LR_LOADFROMFILE);
	if (参数_文件格式 == 图片组文件_位图) {
		局部_返回值 = ImageList_Add(hImageList, (HBITMAP)局部_句柄, 0);
		DeleteObject(局部_句柄);
		return 局部_返回值;
	}
	else if (参数_文件格式 == 图片组文件_图标) {
		局部_返回值 = ImageList_AddIcon(hImageList, (HICON)局部_句柄);
		DestroyIcon((HICON)局部_句柄);
		return 局部_返回值;
	}
	return -1;
}
bool BlackMoonUI::zyLmageList::复制(zyLmageList& 参数_目标图片组, int 参数_目标图片索引, int 参数_源图片索引, int 参数_复制标记) {//把该类指定索引的图片复制到"参数_目标图片组"对应索引。本方法也可以交换指定索引的两个图片。
	return ImageList_Copy(参数_目标图片组.取句柄(), 参数_目标图片索引, (HIMAGELIST)GetMember(), 参数_源图片索引, 参数_复制标记) != 0;
}
BlackMoonUI::zyLmageList BlackMoonUI::zyLmageList::克隆() {//成功返回副本图片组。
	zyLmageList ret;
	ret.置句柄(ImageList_Duplicate((HIMAGELIST)GetMember()));
	return ret;
}
HIMAGELIST BlackMoonUI::zyLmageList::克隆句柄() {//成功返回副本图片组句柄
	return ImageList_Duplicate((HIMAGELIST)GetMember());
}
bool BlackMoonUI::zyLmageList::替换图标(int 参数_被替换图标索引, zyIcon& 参数_图标) {//根据"参数_图标"替换指定索引的图片。
	int 局部_返回值 = ImageList_ReplaceIcon((HIMAGELIST)GetMember(), 参数_被替换图标索引, 参数_图标.getIcon());
	return 局部_返回值 != 0;
}
bool  BlackMoonUI::zyLmageList::删除(int 参数_索引) {
	return ImageList_Remove((HIMAGELIST)GetMember(), 参数_索引) != 0;
}
int  BlackMoonUI::zyLmageList::取背景色() {//返回图片组图片的背景颜色。
	return ImageList_GetBkColor((HIMAGELIST)GetMember());
}
int  BlackMoonUI::zyLmageList::置背景色(int 参数_颜色值) {//返回设置前的颜色值。
	return ImageList_SetBkColor((HIMAGELIST)GetMember(), 参数_颜色值);
}
BlackMoonUI::zyIcon BlackMoonUI::zyLmageList::取图标(int 参数_图片索引, int 参数_标志) {
	zyIcon zyIcon;
	zyIcon.setIcon(ImageList_GetIcon((HIMAGELIST)GetMember(), 参数_图片索引, 参数_标志));
	return zyIcon;
}
POINT BlackMoonUI::zyLmageList::取图标尺寸() {//取得图片组单个图像的尺寸。
	int x = 0, y = 0;
	ImageList_GetIconSize((HIMAGELIST)GetMember(), &x, &y);
	return POINT{x,y};
}
bool BlackMoonUI::zyLmageList::置图标尺寸(int 参数_宽度, int 参数_高度) {//设置图片组单个图像的尺寸。
	return ImageList_SetIconSize((HIMAGELIST)GetMember(), 参数_宽度, 参数_高度) != 0;
}
int BlackMoonUI::zyLmageList::取图标数() {//取图片组里的图标数量。
	return ImageList_GetImageCount((HIMAGELIST)GetMember());
}
bool BlackMoonUI::zyLmageList::置图标数(int 参数_数量) {//设置图片组图片的数量
	return ImageList_SetImageCount((HIMAGELIST)GetMember(), 参数_数量) != 0;
}
bool BlackMoonUI::zyLmageList::取图片信息(int 参数_图片索引, IMAGEINFO* 参数_图片信息) {//成功返回"真"，失败返回"假"。
	return ImageList_GetImageInfo((HIMAGELIST)GetMember(), 参数_图片索引, 参数_图片信息) != 0;
}
bool BlackMoonUI::zyLmageList::画图标Ex(int 参数_图片索引, HDC 参数_hdc, int 参数_横坐标, int 参数_纵坐标, int 参数_宽度, int 参数_高度,
	int 参数_背景色, int 参数_前景色, int 参数_标志) {//成功返回"真"，失败返回"假"。
	int 局部_返回值 = ImageList_DrawEx((HIMAGELIST)GetMember(), 参数_图片索引, 参数_hdc, 参数_横坐标, 参数_纵坐标,
		参数_宽度, 参数_高度, 参数_背景色, 参数_前景色, 参数_标志);
	return 局部_返回值 != 0;
}